package com.demo.resourcecode.c10tx;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Transactional(propagation = Propagation.REQUIRED)
public class PersonServiceImpl2 {

	private JdbcTemplate jdbcTemplate;

	// 设置数据源
	public void setDataSource(DataSource dataSource){
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	public void save(Test t) throws RuntimeException {
		jdbcTemplate.update("insert into test(id, name) values (?, ?)", new Object[]{t.getId(), t.getName()}, new int[]{java.sql.Types.INTEGER, java.sql.Types.VARCHAR});
		// 事务测试，加上这句则数据不会被保存到数据库中，注意默认情况下，spring中的事务处理只对RuntimeException方法进行回滚，如果换成Exception将不会回滚
		// 放开这段代码，会导致《6异常回滚.txt》里的doSetRollbackOnly(status)，说明内嵌代码报异常，那么不会直接回滚，而是设置一个标识，当等到外部事务提交时，一旦判断出当前事务流被设置了
		// 回滚标识，则由外部事务来统一进行整体事务的回滚
		// 如果注释掉这段代码，这里也不会马上提交。
		throw new RuntimeException("aa");
	}

}
